package com.tedu.day02.oop;

/**
 *  抽象类的特点:<补充>
 *         类: 成员变量/成员方法/构造方法
 *         抽象类: 成员变量/成员方法/构造方法
 *         创建抽象类----普通类变成(实现)子类---继承抽象类
 *         成员变量: 既可以是变量，也可以是常量
 *         构造方法: 有，用于子类访问调用抽象【父】类的成员变量---赋值
 *         成员方法: 既可以抽象，非抽象
 *         抽象方法与非抽象方法出现在抽象类问题:
 *         A： 抽象方法  【重写】强调要求子类完成父类抽象方法
 *         B:  非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public int J=20;  //成员变量: 常量
    //Java强类型语言： 大小写分明
    // public int j=30;
    //构造方法:无参
    public Foo() {
        this(30);   //调用当前类对象的其他构造器
    }

    public Foo(int i) {
        this.i =i;
    }
    //成员方法: 抽象方法
    public abstract void show();
    //成员方法: 非抽象方法
    public void method(){
        System.out.println("Foo       method");
    }
}
//实现  【子】类
class Goo extends Foo{

    public void show() {
        System.out.println("Goo   show");
    }
    public void metnod(){
        System.out.println("Goo   method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类---继承---多态性---向上造型
        Foo f=new Goo();
        //①实例化---子类的构造器，默认存在一个无参构造器
        // 在通过super()调用父类无参构造器
        //②执行抽象类无参构造器，发现有this(参数)调用本类其他有参构造器
        //③this调用的同时，完成对抽象类中 i 进行赋值  i=30
        System.out.println(f.i);   // 30
        // f.J=i40;  不可修改
        System.out.println(f.J);

        //----------------------------------
        f.show();      //输出: Goo  show  重写
        f.method();    //输出: Goo  show  拓展【子类方法重写】
    }
}
/**
 * 拓展:  abstract关键共存问题
 */
abstract class Aoo{
   // private abstract void show1();  冲突
   // public final abstract void show2(); 冲突
    // public static abstract void show3();
    // 无意义: 静态方法需要加语法块{},抽象方法
}
